package coop.tecso.modelo1.core;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import coop.tecso.modelo1.util.Command;
import coop.tecso.modelo1.util.GeneratorId;
import coop.tecso.modelo1.util.ProcessExecuteStatement;
import coop.tecso.modelo1.util.SimpleExecuteStatement;
import coop.tecso.modelo1.util.UtilDB;
import coop.tecso.modelo1.exceptions.ProgramException;

public abstract class Crud {

	protected boolean[] dirty = {false, false, false, false, false};
	
	/** executeQuery. metodo generico para realizar consultas **/

	private void executeSQLStatement(String sqlStatement, Command command) throws ProgramException{

		UtilDB db =  UtilDB.getUtilDB();
		Connection conn = null;
			
		try {
			
			conn = db.getConnection();       
            Statement stmt = conn.createStatement();            
            
            command.execute(stmt, sqlStatement);
            

        } catch (SQLException se) {
            System.out.println(se.getMessage()+" : "+ se.getSQLState());
            se.printStackTrace();
            throw new ProgramException(se.getMessage()+" : "+ se.getSQLState());

        } catch (Exception ex){
        	System.out.println(ex.getMessage());
            throw new ProgramException(ex.getMessage());

        } finally {
        	try {
        		if(conn!=null){
        			conn.close();
        		}
        	} catch (SQLException se){
        		System.out.println(se.getMessage()+" : "+ se.getSQLState());
        		se.printStackTrace();
        		throw new ProgramException(se.getMessage()+" : "+se.getSQLState());
        	}
        	
        }
		
		 
	}
	
	
	
	/** Insert. para ingresar registros **/
	
	public void create(Entidad entidad) throws Exception{
		
	   entidad.setId(GeneratorId.getGeneratorId().getId(entidad.getClass().getSimpleName()));
	   Command command = new SimpleExecuteStatement();
       try {	/* se debe utilizar este try?..para no ejecutar la segunda sentencia si no se logra el insert? */
    	   this.executeSQLStatement(entidad.getInsertSQLStatement(), command);
		   GeneratorId.getGeneratorId().setId(entidad.getClass().getSimpleName(), entidad.getId()-1);
       } catch (Exception e) {
    	   e.printStackTrace();
       }
       
	}
	
	
	/** Delete. para eliminar registros **/
	
	public void delete(Entidad entidad) throws Exception{

		Command command = new SimpleExecuteStatement();
		this.executeSQLStatement(entidad.getDeleteSQLStatement(), command);
		
	}
	
	
	/** Update. para actualizar registros **/
	
	public void update(Entidad entidad) throws Exception{
		
		Command command = new SimpleExecuteStatement();
		this.executeSQLStatement(entidad.getUpdateSQLStatement(), command);
		
	}
	
	
	/** Find. para hacer consultas **/
	
	public Entidad find(Entidad entidad) throws Exception{
		
		ProcessExecuteStatement command = new ProcessExecuteStatement();
		command.setBean(entidad);
		command.setBeanProperties(entidad.getbeanProperties());
		//this.executeSQLStatement(entidad.getUpdateSQLStatement(), command); //TODO: consultar sobre este Statement
		return (Entidad)command.getBean();
		
	}
	


}

